package VISTA.ventanas;

import BD.Proceso;
import NEGOCIOS.ControlProceso;
import java.beans.PropertyVetoException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JOptionPane;
import javax.swing.table.DefaultTableModel;
import reportes.Modulos.ModuloReporte;

public class ControlDeProduccion extends javax.swing.JInternalFrame {

    public ControlDeProduccion() {
        initComponents(); 
    }

    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jPanel5 = new javax.swing.JPanel();
        jtpProduccion = new javax.swing.JTabbedPane();
        jspProduccion = new javax.swing.JScrollPane();
        jtProduccion = new javax.swing.JTable();
        jlTitulo = new javax.swing.JLabel();
        jpControles = new javax.swing.JPanel();
        jbNuevo = new javax.swing.JButton();
        jbQuitar = new javax.swing.JButton();
        jbReporte = new javax.swing.JButton();
        jbGuardar = new javax.swing.JButton();
        jbSalir = new javax.swing.JButton();

        setClosable(true);
        setTitle("Control de producción");
        setFrameIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/dollar.png"))); // NOI18N
        setPreferredSize(new java.awt.Dimension(760, 547));

        jPanel5.setBackground(new java.awt.Color(153, 51, 0));

        jtpProduccion.setBackground(new java.awt.Color(204, 0, 0));

        jspProduccion.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                jspProduccionComponentShown(evt);
            }
        });

        jtProduccion.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Modelo", "Cantidad", "Color y Tipo de hilo"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, true, true, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        jtProduccion.addComponentListener(new java.awt.event.ComponentAdapter() {
            public void componentShown(java.awt.event.ComponentEvent evt) {
                jtProduccionComponentShown(evt);
            }
        });
        jspProduccion.setViewportView(jtProduccion);
        jtProduccion.getColumnModel().getColumn(0).setPreferredWidth(60);
        jtProduccion.getColumnModel().getColumn(0).setMaxWidth(60);

        jtpProduccion.addTab("Producción", jspProduccion);

        jlTitulo.setBackground(new java.awt.Color(255, 204, 0));
        jlTitulo.setFont(new java.awt.Font("Brush Script MT", 3, 36)); // NOI18N
        jlTitulo.setText(" Control de Producción");
        jlTitulo.setOpaque(true);

        jpControles.setBackground(new java.awt.Color(255, 255, 255));

        jbNuevo.setIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/New.png"))); // NOI18N
        jbNuevo.setText("Nuevo elemento");
        jbNuevo.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jbNuevo.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jbNuevoMouseClicked(evt);
            }
        });

        jbQuitar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/delete.png"))); // NOI18N
        jbQuitar.setText("Quitar elemento");
        jbQuitar.setEnabled(false);
        jbQuitar.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jbQuitar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jbQuitarMouseClicked(evt);
            }
        });

        jbReporte.setIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/Report.png"))); // NOI18N
        jbReporte.setText("Generar reporte");
        jbReporte.setEnabled(false);
        jbReporte.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jbReporte.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jbReporteMouseClicked(evt);
            }
        });

        jbGuardar.setIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/save.png"))); // NOI18N
        jbGuardar.setText("Guardar elemento");
        jbGuardar.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jbGuardar.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                jbGuardarMouseClicked(evt);
            }
        });
        jbGuardar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbGuardarActionPerformed(evt);
            }
        });

        jbSalir.setIcon(new javax.swing.ImageIcon(getClass().getResource("/VISTA/iconos/general/Cancel.png"))); // NOI18N
        jbSalir.setText("Salir");
        jbSalir.setHorizontalAlignment(javax.swing.SwingConstants.LEFT);
        jbSalir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jbSalirActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jpControlesLayout = new javax.swing.GroupLayout(jpControles);
        jpControles.setLayout(jpControlesLayout);
        jpControlesLayout.setHorizontalGroup(
            jpControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpControlesLayout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jpControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jbSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 155, javax.swing.GroupLayout.PREFERRED_SIZE)
                    .addGroup(jpControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                        .addComponent(jbReporte, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jbQuitar, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                        .addComponent(jbGuardar, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.PREFERRED_SIZE, 0, Short.MAX_VALUE)
                        .addComponent(jbNuevo, javax.swing.GroupLayout.Alignment.LEADING, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jpControlesLayout.setVerticalGroup(
            jpControlesLayout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jpControlesLayout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jbNuevo, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jbGuardar, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jbQuitar, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jbReporte, javax.swing.GroupLayout.PREFERRED_SIZE, 35, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 224, Short.MAX_VALUE)
                .addComponent(jbSalir, javax.swing.GroupLayout.PREFERRED_SIZE, 31, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
        );

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jtpProduccion)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jpControles, javax.swing.GroupLayout.PREFERRED_SIZE, 166, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap())
            .addComponent(jlTitulo, javax.swing.GroupLayout.DEFAULT_SIZE, 744, Short.MAX_VALUE)
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                .addComponent(jlTitulo, javax.swing.GroupLayout.PREFERRED_SIZE, 55, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(jtpProduccion, javax.swing.GroupLayout.DEFAULT_SIZE, 435, Short.MAX_VALUE)
                    .addComponent(jpControles, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jPanel5, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                .addContainerGap())
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void jtProduccionComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jtProduccionComponentShown
        
    }//GEN-LAST:event_jtProduccionComponentShown

    private void jspProduccionComponentShown(java.awt.event.ComponentEvent evt) {//GEN-FIRST:event_jspProduccionComponentShown
        llenarTabla();
        //Si la tabla tiene filas se habilitan los botones
        if (jtProduccion.getRowCount() > 0) {
            jbQuitar.setEnabled(true);
            jbReporte.setEnabled(true);
        }
    }//GEN-LAST:event_jspProduccionComponentShown

    private void jbNuevoMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jbNuevoMouseClicked
        //Creo el objeto que contendra el modelo de la tabla
        DefaultTableModel modelo;
        //Obtengo el modelo de la tabla
        modelo = (DefaultTableModel) jtProduccion.getModel();
        //Agrego una nueva fila en blanco
        modelo.addRow(new Object[2]);
    }//GEN-LAST:event_jbNuevoMouseClicked

    private void jbQuitarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jbQuitarMouseClicked
        //termino edicion
        jtProduccion.removeEditor();
        //Creo el objeto que contendra el modelo de la tabla
        DefaultTableModel modelo;
        //Obtengo el modelo de la tabla
        modelo = (DefaultTableModel) jtProduccion.getModel();
        //Verifico que se halla seleccionado una fila
        if (jtProduccion.getSelectedRow() > -1) {
            //Verificar si es una fila vacia o contiene informacion 
            if (modelo.getValueAt(jtProduccion.getSelectedRow(), 0) != null) {
                //En caso de que tenga un contenido lo borro de la base de datos
                ControlProceso cp = new ControlProceso();
                //Creo y armo el objeto que deseo borrar
                Proceso proceso = new Proceso();
                proceso.setId(Integer.parseInt(modelo.getValueAt(jtProduccion.getSelectedRow(), 0).toString()));
                proceso.setModelo(modelo.getValueAt(jtProduccion.getSelectedRow(), 1).toString());
                proceso.setCantidad(Integer.parseInt(modelo.getValueAt(jtProduccion.getSelectedRow(), 2).toString()));
                proceso.setColorYTipoHilo(modelo.getValueAt(jtProduccion.getSelectedRow(), 3).toString());
                //Elimino el objeto
                cp.eliminarProceso(proceso);
                limpiarTabla();
                llenarTabla();
            }else{
                modelo.removeRow(jtProduccion.getSelectedRow());
            }
            if(jtProduccion.getRowCount()<1){
                jbQuitar.setEnabled(false);
                jbReporte.setEnabled(false);
            }
        } else {
            //Si no selecciono una fila le informo al usuario
            JOptionPane.showMessageDialog(this, "Seleccione un proceso para "
                    + "poder eliminarlo", "No se ha seleccionado un proceso", 0);
        }
    }//GEN-LAST:event_jbQuitarMouseClicked

    
    private void limpiarTabla() {
        DefaultTableModel modelo = (DefaultTableModel) jtProduccion.getModel();
        while (jtProduccion.getRowCount() > 0) {
            modelo.removeRow(0);
        }
    }

    private void llenarTabla() {

        //Creo el objeto que me permite interactuar con la DB
        ControlProceso cProceso = new ControlProceso();
        //Creo un modelo para luego ponerlo en la tabla
        DefaultTableModel modelo = (DefaultTableModel) jtProduccion.getModel();
        //Obtengo una lista de todos los procesos guardados en la DB
        List procesos = cProceso.seleccionarTodosLosProcesos();
        //Lleno la tabla
        for (int i = 0; i < procesos.size(); i++) {
            Proceso proceso = (Proceso) procesos.get(i);
            modelo.addRow(new String[]{proceso.getId().toString(),
                proceso.getModelo(), String.valueOf(proceso.getCantidad()), proceso.getColorYTipoHilo()});
        }
    }

    private void jbGuardarMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jbGuardarMouseClicked
        //Verifico que la tabla no este vacia
        if (jtProduccion.getRowCount() > 0) {
            //termino seleccion
            if(jtProduccion.isEditing()){
            jtProduccion.getCellEditor().stopCellEditing();
            }
            //Si no lo esta guardo todos lo cambios
            ControlProceso cp = new ControlProceso();
            //Obtengo el modelo
            DefaultTableModel modelo;
            modelo = (DefaultTableModel) jtProduccion.getModel();
            //Lleno la lista para guardarlos
            List<Proceso> procesos = new ArrayList<>();
            for (int i = 0; i < jtProduccion.getRowCount(); i++) {
                //Si no existe en la DB lo guardo
                if (modelo.getValueAt(i, 0) == null) {
                    Proceso proceso = new Proceso();
                    proceso.setModelo(modelo.getValueAt(i, 1).toString());
                    proceso.setCantidad(Integer.parseInt(modelo.getValueAt(i, 2).toString()));
                    proceso.setColorYTipoHilo(modelo.getValueAt(i, 3).toString());
                    procesos.add(proceso);
                } //Si ya existe en la base de datos lo actualizo
                else {
                    Proceso proceso = new Proceso();
                    proceso.setId(Integer.parseInt(modelo.getValueAt(i, 0).toString()));
                    proceso.setModelo(modelo.getValueAt(i, 1).toString());
                    proceso.setCantidad(Integer.parseInt(modelo.getValueAt(i, 2).toString()));
                    proceso.setColorYTipoHilo(modelo.getValueAt(i, 3).toString());
                    procesos.add(proceso);
                }
            }
            //Guardo la lista
            cp.agregarVariosProcesos(procesos);
            //Borro las filas actuales y las actualizo
            limpiarTabla();
            llenarTabla();
            //Si todo sale bien informo al usuario
            JOptionPane.showMessageDialog(this, "Procesos guardados correctamente.",
                    "Guardado", 1);
            if(jtProduccion.getRowCount()>0){
                jbQuitar.setEnabled(true);
                jbReporte.setEnabled(true);
            }
        } else {
            //Si esta vacia le informo al usuario
            JOptionPane.showMessageDialog(this, "No hay procesos que guardar.",
                    "Tabla vacia", 0);
        }
    }//GEN-LAST:event_jbGuardarMouseClicked

    private void jbSalirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbSalirActionPerformed
        try {
            this.setClosed(true);
            System.gc();
        } catch (PropertyVetoException ex) {
            this.dispose();
            System.gc();
        }
    }//GEN-LAST:event_jbSalirActionPerformed

    private void jbGuardarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jbGuardarActionPerformed
        
    }//GEN-LAST:event_jbGuardarActionPerformed

    private void jbReporteMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_jbReporteMouseClicked
        //Verifico que la tabla no este vacia
        if(jtProduccion.getRowCount()>0){
            //Si hay registros en la BD genero el reporte
            ModuloReporte modRep = new ModuloReporte("Proceso");
        }else{
            //Si no existen registros en la base de datos lo reporto al usuario
            JOptionPane.showMessageDialog(this, "No hay procesos de producción "
                    + "existentes."+"\n"+"Introdusca al menos un procesos para "
                    + "poder generar el reporte.","No hay procesos",0);
        }
    }//GEN-LAST:event_jbReporteMouseClicked

    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JPanel jPanel5;
    private javax.swing.JButton jbGuardar;
    private javax.swing.JButton jbNuevo;
    private javax.swing.JButton jbQuitar;
    private javax.swing.JButton jbReporte;
    private javax.swing.JButton jbSalir;
    private javax.swing.JLabel jlTitulo;
    private javax.swing.JPanel jpControles;
    private javax.swing.JScrollPane jspProduccion;
    private javax.swing.JTable jtProduccion;
    private javax.swing.JTabbedPane jtpProduccion;
    // End of variables declaration//GEN-END:variables
}
